"""
同步和异步
    同步：多任务，多个任务之间执行的时候是有先后顺序的，必须一个执行完成之后，另外一个才能继续执行
        只有一个线程：等我说完你再说（同一时间只能做一件事）
    异步：多个任务执行是没有先后顺序的，可以同时运行。执行时候先后顺序也不会有什么影响，存在多条任务主线
        发微信（可以不等待对方回复，继续发） 点外卖（点了外卖后，我们可以继续玩游戏）

 在多线程中，怎么完成同步？
    必须要用到线程锁
 线程锁的机制：当线程获取资源后，立刻进行锁定，等待资源使用完毕后再解锁。有效的保证同一时间只有一个线程资源再使用

 实现锁的方式：
    创建锁
     lock = threading.Lock()
    锁定
     lock.acquire()
    解锁
     lock.release()

 1.创建一把互斥锁
 2。在使用资源前需要锁定资源 上锁
 3。使用资源之后需要解锁
 有两个任务 work1 work2  查看work1线程对全局变量进行，在work2能否查看并修改work1的结果
"""
import threading #导入线程模块
import time #导入时间模块

#声明要修改的全局变量
g_num = 0

#work1 :先对全局变量进行修改并输出
def work1():
    # 如何在函数使用全局变量？global
    global g_num
    #上锁
    lock1.acquire()
    #使用资源
    for i in range(100000000):
        g_num += 1
    #解锁
    lock1.release()
    print("work1------------------",g_num)


#work2：在work1修改基础上在修改一次
def work2():
    global g_num
    #上锁
    lock1.acquire()
    #使用资源
    for i in range(10):
        g_num += 1
    #解锁
    lock1.release()
    print("work2-------------------",g_num)

if __name__ == '__main__':
    #1.创建一锁
    lock1 = threading.Lock()
    t1 = threading.Thread(target=work1)
    t2 = threading.Thread(target=work2)
    t1.start()
    t2.start()

    while( len(threading.enumerate()) != 1 ):
        time.sleep(1)
    print("----------main---------",g_num)